/**
 * Created on : 2015/11/28
 * Author     : @kankan
 */

/************************************************************************************************************************
 ******************************************************** xmenutree *********************************************************
 ************************************************************************************************************************/
// create xmenutree object
var xmenutree = xmenutree || {};

(function() {

    /**************************************************
     * XMenuTree
     **************************************************/
    var XMenuTree = function(obj, options) {
		var self = this;
    	
		self.$obj = obj;								// 加了$只是为了区分Js变量而已，可以用来表示这个变量是一个jquery对象，没其他含义
		self.$options = options;
		self.$elem = null;

		self._init();
    };
    
    XMenuTree.prototype = {
        /* 初始化 */
        _init: function() {
            var self = this;
            
            self._preProcess();
            self._createDomElem();
            self._show();
    		
            return self;								// VERY IMPORTANT!!! 这样才能继续调用后面的其它方法
        },
        
        /* 预处理 */
        _preProcess: function() {
            var self = this;
            
            self.$options = $.extend({}, XMenuTree.DEFAULTS, self.$options);				// 将调用者的参数与本对象的默认参数进行合并
            // 获取数据
            if (self.$options.url) {
            	var request = $.extend({}, self.$options.ajaxOptions, {
	                method: self.$options.method,
	            	url: self.$options.url,
	                data: self.$options.params,
	                async: false,
	                success: function(data) {
	                	self._execLoadFunc('onLoadSuccess', data);
	                	
	                    if (self.$options.ajaxDataFilter && typeof self.$options.ajaxDataFilter === 'function') {
	                    	self.$options.data = self.$options.ajaxDataFilter(data);
	                    } else {
	                    	self.$options.data = data;
	                	}
	                },
	                error: function(XMLHttpRequest, textStatus) {
	                    self._execLoadFunc('onLoadError', XMLHttpRequest, textStatus);		// +++
	                },
	                complete: function() {
//	                    if (!silent) {														// 增加加载显示功能，待完善+++
//	                        that.$tableLoading.hide();
//	                    }
	                }
	            });
	            $.ajax(request);
            }

            // 处理图标
        	// 放在构建HTML时中的循环里进行处理
        },
        
        /* 执行加载方法 */
        _execLoadFunc: function(type, data, textStatus) {
            var self = this;
            if (self.$options[type] && typeof self.$options[type] === 'function') {
                self.$options[type](data, textStatus);
            }
        },
        
        /* 执行方法 */
        _execFunc: function(type) {
            var self = this;
            if (self.$options[type] && typeof self.$options[type] === 'function') {
                self.$options[type](self);
            }
        },
        
        /* 构建HTML */
        _createDomElem: function() {
            var self = this;
            
    		self.$elem = self._createTree(self.$options.data, 0);
    		self._addClass();
        },

        /* JSON递归动态生成树 */
        _createTree: function(data, pid) {
            var self = this;
			var holder = $('<ul></ul>');
			
        	if (data != null) {
    			for (var i = 0; i < data.length; i++) {
    				if (data[i].pid == pid && data[i].type == 1) {		// 只处理type为1即菜单型的资源
    					var tempLi = $('<li></li>');
    					var tempA = null;
    					
    					if (data[i].pid == 0) {							// 一级节点
        					tempA = $('<a href="#"><i class="' + (data[i].ext_info ? data[i].ext_info : self.$options.parentIcon) + '"></i><span>' + data[i].name + '</span></a>');
	    					if (data[i].action == '') {					// 真一级节点
	    						tempA.append($('<i class="fa fa-caret-left pull-right"></i>'));
	    						tempA.off('click').on('click', {index: i}, function(event) {
	    							var j = event.data.index;
	                				$(this).next().slideToggle(self.$options.animationSpeed);
	                        		$(this).parent().toggleClass('active').siblings().removeClass('active').find('.treeview-menu').slideUp(self.$options.animationSpeed);
	                        		if (self.$options.handler && typeof self.$options.handler === 'function') {			// 交给用户处理吧
		                            	self.$options.handler(self.$options.data[j]);										// 将对象返回给用户
		                            }
	                    		});
	    					} else {									// 伪一级节点（子节点）
	    						tempA.off('click').on('click', {index: i}, function(event) {								// 本应该写在_biuldEvent里，但为了代码精简，就写在这里了
		                			var j = event.data.index;
		                    		$(this).parent().toggleClass('active').siblings().removeClass('active').find('.treeview-menu').slideUp(self.$options.animationSpeed);
		            				if (self.$options.handler && typeof self.$options.handler === 'function') {			// 交给用户处理吧
		                            	self.$options.handler(self.$options.data[j]);										// 将对象返回给用户
		                            }
		                		});
	    					}
    					} else {										// 子节点
        					tempA = $('<a href="#"><i class="' + (data[i].ext_info ? data[i].ext_info : self.$options.childIcon) + '"></i><span>' + data[i].name + '</span></a>');
    						tempA.off('click').on('click', {index: i}, function(event) {
    							var j = event.data.index;
//                        		$(this).parent().addClass('active').siblings().removeClass('active');
    							$('.treeview-menu li').removeClass('active');
    							$(this).parent().addClass('active');
                                if (self.$options.handler && typeof self.$options.handler === 'function') {				// 交给用户处理吧
                                	self.$options.handler(self.$options.data[j]);											// 将子菜单对象返回给用户
                                }
                    		});
    					}
    					
    					tempLi.append(tempA);
    					tempLi.append(this._createTree(data, data[i].id));
    					holder.append(tempLi);
    				}
    			}
    		}
			if (holder.html() != '') {
	    		return holder;
			}
    		return null;					// 可以是null吗
        },

        /* 添加class */
        _addClass: function() {
            var self = this;
            if (self.$elem != null) {
            	self.$elem.addClass('sidebar-menu');
                self.$elem.children().children('ul').addClass('treeview-menu');
            }
        },
        
        /* _show */
        _show: function() {
            var self = this;
            $(self.$obj).append(self.$elem);
            self._execFunc('afterShow');
        }
    };

    XMenuTree.DEFAULTS = {
    	url					: '',
    	method      		: 'GET',
        cache				: true,
        contentType			: 'application/json',
        dataType			: 'json',
        ajaxOptions			: {},
    	params          	: {},
    	onLoadSuccess		: null,
    	onLoadError			: null,
    	ajaxDataFilter		: null,
    	afterShow			: null,
    	data				: '',
		animationSpeed		: 150,
    	parentIcon     		: 'fa fa-dashboard',
    	childIcon	      	: 'fa fa-genderless',
    	handler				: null,
    };
    
    /** xmenutree */
	xmenutree = function(obj, options) {
		return new XMenuTree(obj, options);
    };
    xmenutree.defaults = XMenuTree.DEFAULTS;
    
})();